package com.hyperboost.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.security.SecureDigestAlgorithm;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.Map;

public class JwtUtil {

    /**
     * 生成JWT-Token字符串
     *
     * @param secretKey
     * @param ttlMillis
     * @param claims
     * @return
     */
    public static String createToken(String secretKey, long ttlMillis, Map<String, Object> claims) {

        // 指定JWT的加密算法为HS256
        SecureDigestAlgorithm<SecretKey, SecretKey> algorithm = Jwts.SIG.HS256;
        // 设置JWT的过期时间为当前时间加上ttlMillis毫秒
        Date exp = new Date(System.currentTimeMillis() + ttlMillis);
        // 转化JWT密钥字符串为SecretKey对象
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes());

        String compact = Jwts.builder()
                .signWith(key, algorithm) // 设置签名算法和密钥
                .expiration(exp) // 设置过期时间
                .claims(claims) // 设置自定义的声明
                .compact(); // 生成JWT-Token字符串
        return compact;
    }

    /**
     * 解析JWT-Token字符串
     *
     * @param secretKey
     * @param token
     * @return
     */
    public static Claims parseToken(String secretKey, String token){

        // 转化JWT密钥字符串为SecretKey对象
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes());

        Claims claims = (Claims) Jwts.parser()
                .verifyWith(key)
                .build()
                .parseSignedClaims(token)
                .getPayload(); // 解析JWT-Token字符串
        return claims;
    }
}
